#include <my_header.h>
#include "../include/threadPool.h"
#include "../include/taskQueue.h"

int main(int argc, char *argv[])
{

    // ./server ip port 子线程数
    ARGS_CHECK(argc, 4);

    threadPool_t threadPool;                    // 申请一块内存
    threadPoolInit(&threadPool, atoi(argv[3])); // 申请完了初始化一下
    // 初始完了线程池，可以创建工人线程
    makeWorker(&threadPool);
    // 初始化监听socket
    int sockfd = tcpInit(argv[1], argv[2]);
    // 创建epoll实例，将sockfd加入监听
    int epfd = epoll_create(1);
    epollAdd(epfd, sockfd); // 将sockfd加入监听
    printf("服务端启动成功，等待客户端连接\n");
    while (1)
    {
        struct epoll_event readyset[1024];
        int readyNum = epoll_wait(epfd, readyset, 1024, -1);
        for (int i = 0; i < readyNum; i++)
        {
            if (readyset[i].data.fd == sockfd)
            {
                // 有新的客户端连接
                int netfd = accept(sockfd, NULL, NULL);
                if (netfd < 0)
                {
                    perror("accept error");
                    continue;
                }

                /* // 获取客户端IP */
                /* char client_ip[16] = {0}; */
                /* inet_ntop(AF_INET, &clientAddr.sin_addr, client_ip, sizeof(client_ip)); */

                printf("有新的客户端连接，netfd = %d\n", netfd);
                // 加入任务队列并唤醒子线程
                pthread_mutex_lock(&threadPool.mutex);
                enQueue(&threadPool.taskQueue, netfd);
                pthread_cond_signal(&threadPool.cond);
                pthread_mutex_unlock(&threadPool.mutex);
            }
        }
    }

    return 0;
}
